package com.wuchao.signer.single;

/**
 * @Author wuchao66
 * @Date 2023/10/28 10:14
 * @PackageName:com.wuchao.signer.single
 * @ClassName: SingletonClass
 * @Description: TODO
 * @Param
 * @Version 1.0
 */
public class SingletonClass {
    //volatile保证有线程对该变量修改时,另一个线程中该变量的缓存行无效,读取时直接到内存读
    //总之,若一个线程修改了某个变量的值,新值对其他线程来说是立即可见的,在访问点内检查时要用到
    private volatile static SingletonClass singletonClass;

    //构造函数私有化,使不能从外部创建本类对象
    private SingletonClass() {
    }

    //使用DCL锁保证线程安全,不需要对整个方法synchronized同步
    public static SingletonClass getInstance() {
        //如果该线程发现该对象未创建
        if (null == singletonClass) {
            //那么首先要和其它线程竞争本类的锁
            synchronized (SingletonClass.class) {
                //获得锁以后,才能执行这部分代码
                //这时再次检查是否为null
                //如果还是null,说明自己是第一个竞争到锁的,本线程负责创建对象
                if (null == singletonClass)
                    singletonClass = new SingletonClass();
                //如果不是null了,说明自己这份锁已经是别人用过,创建好对象以后释放出来的
                //这时对象已经被创建过了,本线程什么都不用做,直接释放锁即可
            }
        }
        //至此,对象一定唯一地创建过了,直接返回
        return singletonClass;
    }
}
